Michael Wilson DSC-611
Data Visualization - Fall 2022
Week 2 Visualization Assignment - Pie Charts

Dataset

The dataset for this assignment is the Vehicles table from the United States Environmental Protection Agency (EPA). It is available in multiple formats and can be downloaded through FuelEconomy.gov (EPA, 2022).

Pre-Processing

In this assignment, we are trying to visualize categorical data in a pie chart. In this case, the relative number of make and model offerings by the type of energy or fuel used. The data table goes all the way back to 1985 when battery-powered electric vehicles really weren’t available in significant quantities. From the Vehicles table, we will need to restrict the dataset to vehicles 2020 or newer.

library(tidyverse)
library(gcookbook)
library(readr)
library(dplyr)
library(plotly)
#read in data and select appropriate subset
vehicles <- read_csv("Grad School 2021/DSC-611 Data Visualization/vehicles.csv")
y2020_vehicles <- subset(vehicles, year == 2020)
cars4 <- select(y2020_vehicles, "drive", "fuelType1", "make", "model")
#Get counts of model by type of fuel
cars5 <- cars4 %>%
group_by(fuelType1) %>%
summarise(qty = n())
cars5
NA

First Pie Chart

plot_ly(cars5, labels = ~fuelType1, values = ~qty, type = 'pie', textposition = 'outside', textinfo = 'percent', title = 'Qty of Models Offered by Fuel Type, 2020')

Above is the pie chart representation of the relative proportions for the number of model offerings sorted by the type of fuel or electricity. While the pie chart is a colorful representation, with 5 categories, 3 of them very small, it’s hard to visually compare the smaller sections and notice the potentially significant differences between those proportions simply because they are all very small. This representation is not much better than the table created to make it. Without context, we don’t know the those proportions are good, bad, or even noteworthy. The default options for info shown on mouse hover provides more detail, including the quantities for each class, but that assumes looking at this chart on a computer.

Improving the chart

The first chart could be very effectively presented in the form of a table and provide nearly the same level of information. But to answer any deeper questions like change or progress, we can make the pie chart preferred over a table by providing a series of pie charts to show progression and change over time. Seeing the numbers change in tabular format would not be as easy to notice. The first pie chart is just a snapshot in time. We can help add informative value by creating the same basic chart, just using different snapshots in time. Here, we will add two pie charts, one from the year 2000, and another from the year 2010.

#Make the other 2 data tables for 2000 and 2010
y2000_vehicles <- subset(vehicles, year == 2000)
cars2000 <- select(y2000_vehicles, "drive", "fuelType1", "make", "model")
y2010_vehicles <- subset(vehicles, year == 2010)
cars2010 <- select(y2010_vehicles, "drive", "fuelType1", "make", "model")
#Get the quantities by Fuel Type
cars2000t <- cars2000 %>%
group_by(fuelType1) %>%
summarise(qty = n())
cars2000t
NA
cars2010t <- cars2010 %>%
group_by(fuelType1) %>%
summarise(qty = n())
cars2010t
combo_pie <- plot_ly()
combo_pie <- combo_pie %>% add_pie(data = cars2000t, labels = ~fuelType1, values = ~qty,
                         name = "2000", title = "2000", domain = list(row = 0, column = 0))
combo_pie <- combo_pie %>% add_pie(data = cars2010t, labels = ~fuelType1, values = ~qty,
                         name = "2010", title = "2010", domain = list(row = 0, column = 1))
combo_pie <- combo_pie %>% add_pie(data = cars5, labels = ~fuelType1, values = ~qty,
                         name = "2020", title = "2020", domain = list(row = 0, column = 2))
combo_pie <- combo_pie %>% layout(title = "Offerings by Fuel Type, 2000-2020",
                      grid=list(rows=1, columns=3), legend = list(orientation = 'h'),
                      xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
                      yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))
combo_pie
NA

By combining all three in order in a series of pie charts, we can now see change over time and do more interesting things visually like perceive patterns and trends. Compared with a simple snapshot in time, we can now see the progression over time of increased offerings calling for premium gasoline instead of regular-grade. We can also see that while natural gas powered never had many offerings, and actually declined during the review period. We also see electric vehicles going from just under 0.5% to over 3%. A six-fold increase is quite a lot for such a small portion of the overall market offerings.

Suitability of Pie Charts

As with the “No Free Lunch” theorem, there are no good blanket rules about the usage of pie charts. As shown, a pie chart representing a singular point in time, offered without context, can easily be misleading. As the number of categories to represent in the pie chart get added, they do become less useful as the difference between a 5 percent slice of the pie and a 7 percent slice is hard to tease out when there are 10 other categories all with single digit percentage slices.

However, for a limited number of categories (usually 5 or less), and large disparities in the proportions of the categories, a pie chart can highlight the large differences quickly and easily. Usually, though, a pie chart needs context to help convey a message. Thinking about how a pie chart is made in ggplot2 as really just a single-width stacked bar graph, presented in polar coordinates offers some of the real weaknesses of pie charts. Specifically, a pie chart can usually be expressed in multiple other forms and be just as easy to use and understand. Coupling the relative redundancy of pie charts with the challenges in showing a lot of categories in a clear way doesn’t demand that they be avoided, but rather one should potentially look for another representation that works as well or better. Pie charts might be a type of visualization to avoid for a lot of situations, but there would still remain the situations - infrequent as they may be - where a pie chart is highly effective and appropriate.

References:

United States Environmental Protection Agency. (2021). Vehicles.csv [Data set] Retrieved from: https://www.fueleconomy.gov/feg/epadata/vehicles.csv (Accessed 8 Sep 2022).

LS0tDQp0aXRsZTogIkRTQy02MTEgRGF0YSBWaXN1YWxpemF0aW9uIFdlZWsgMiBBc3NpZ25tZW50IC0gV2lsc29uIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KTWljaGFlbCBXaWxzb24gRFNDLTYxMVwNCkRhdGEgVmlzdWFsaXphdGlvbiAtIEZhbGwgMjAyMlwNCldlZWsgMiBWaXN1YWxpemF0aW9uIEFzc2lnbm1lbnQgLSBQaWUgQ2hhcnRzDQoNCiMjIyBEYXRhc2V0DQoNClRoZSBkYXRhc2V0IGZvciB0aGlzIGFzc2lnbm1lbnQgaXMgdGhlIFZlaGljbGVzIHRhYmxlIGZyb20gdGhlIFVuaXRlZCBTdGF0ZXMgRW52aXJvbm1lbnRhbCBQcm90ZWN0aW9uIEFnZW5jeSAoRVBBKS4gSXQgaXMgYXZhaWxhYmxlIGluIG11bHRpcGxlIGZvcm1hdHMgYW5kIGNhbiBiZSBkb3dubG9hZGVkIHRocm91Z2ggRnVlbEVjb25vbXkuZ292IChFUEEsIDIwMjIpLg0KDQojIyMjIFByZS1Qcm9jZXNzaW5nDQoNCkluIHRoaXMgYXNzaWdubWVudCwgd2UgYXJlIHRyeWluZyB0byB2aXN1YWxpemUgY2F0ZWdvcmljYWwgZGF0YSBpbiBhIHBpZSBjaGFydC4gSW4gdGhpcyBjYXNlLCB0aGUgcmVsYXRpdmUgbnVtYmVyIG9mIG1ha2UgYW5kIG1vZGVsIG9mZmVyaW5ncyBieSB0aGUgdHlwZSBvZiBlbmVyZ3kgb3IgZnVlbCB1c2VkLiBUaGUgZGF0YSB0YWJsZSBnb2VzIGFsbCB0aGUgd2F5IGJhY2sgdG8gMTk4NSB3aGVuIGJhdHRlcnktcG93ZXJlZCBlbGVjdHJpYyB2ZWhpY2xlcyByZWFsbHkgd2VyZW4ndCBhdmFpbGFibGUgaW4gc2lnbmlmaWNhbnQgcXVhbnRpdGllcy4gRnJvbSB0aGUgVmVoaWNsZXMgdGFibGUsIHdlIHdpbGwgbmVlZCB0byByZXN0cmljdCB0aGUgZGF0YXNldCB0byB2ZWhpY2xlcyAyMDIwIG9yIG5ld2VyLg0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnY29va2Jvb2spDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkocGxvdGx5KQ0KYGBgDQoNCmBgYHtyfQ0KI3JlYWQgaW4gZGF0YSBhbmQgc2VsZWN0IGFwcHJvcHJpYXRlIHN1YnNldA0KdmVoaWNsZXMgPC0gcmVhZF9jc3YoIkdyYWQgU2Nob29sIDIwMjEvRFNDLTYxMSBEYXRhIFZpc3VhbGl6YXRpb24vdmVoaWNsZXMuY3N2IikNCnkyMDIwX3ZlaGljbGVzIDwtIHN1YnNldCh2ZWhpY2xlcywgeWVhciA9PSAyMDIwKQ0KY2FyczQgPC0gc2VsZWN0KHkyMDIwX3ZlaGljbGVzLCAiZHJpdmUiLCAiZnVlbFR5cGUxIiwgIm1ha2UiLCAibW9kZWwiKQ0KYGBgDQoNCmBgYHtyfQ0KI0dldCBjb3VudHMgb2YgbW9kZWwgYnkgdHlwZSBvZiBmdWVsDQpjYXJzNSA8LSBjYXJzNCAlPiUNCmdyb3VwX2J5KGZ1ZWxUeXBlMSkgJT4lDQpzdW1tYXJpc2UocXR5ID0gbigpKQ0KY2FyczUNCmBgYA0KIyMjIEZpcnN0IFBpZSBDaGFydA0KDQpgYGB7cn0NCnBsb3RfbHkoY2FyczUsIGxhYmVscyA9IH5mdWVsVHlwZTEsIHZhbHVlcyA9IH5xdHksIHR5cGUgPSAncGllJywgdGV4dHBvc2l0aW9uID0gJ291dHNpZGUnLCB0ZXh0aW5mbyA9ICdwZXJjZW50JywgdGl0bGUgPSAnUXR5IG9mIE1vZGVscyBPZmZlcmVkIGJ5IEZ1ZWwgVHlwZSwgMjAyMCcpDQpgYGANCkFib3ZlIGlzIHRoZSBwaWUgY2hhcnQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlbGF0aXZlIHByb3BvcnRpb25zIGZvciB0aGUgbnVtYmVyIG9mIG1vZGVsIG9mZmVyaW5ncyBzb3J0ZWQgYnkgdGhlIHR5cGUgb2YgZnVlbCBvciBlbGVjdHJpY2l0eS4gV2hpbGUgdGhlIHBpZSBjaGFydCBpcyBhIGNvbG9yZnVsIHJlcHJlc2VudGF0aW9uLCB3aXRoIDUgY2F0ZWdvcmllcywgMyBvZiB0aGVtIHZlcnkgc21hbGwsIGl0J3MgaGFyZCB0byB2aXN1YWxseSBjb21wYXJlIHRoZSBzbWFsbGVyIHNlY3Rpb25zIGFuZCBub3RpY2UgdGhlIHBvdGVudGlhbGx5IHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGJldHdlZW4gdGhvc2UgcHJvcG9ydGlvbnMgc2ltcGx5IGJlY2F1c2UgdGhleSBhcmUgYWxsIHZlcnkgc21hbGwuIFRoaXMgcmVwcmVzZW50YXRpb24gaXMgbm90IG11Y2ggYmV0dGVyIHRoYW4gdGhlIHRhYmxlIGNyZWF0ZWQgdG8gbWFrZSBpdC4gV2l0aG91dCBjb250ZXh0LCB3ZSBkb24ndCBrbm93IHRoZSB0aG9zZSBwcm9wb3J0aW9ucyBhcmUgZ29vZCwgYmFkLCBvciBldmVuIG5vdGV3b3J0aHkuIFRoZSBkZWZhdWx0IG9wdGlvbnMgZm9yIGluZm8gc2hvd24gb24gbW91c2UgaG92ZXIgcHJvdmlkZXMgbW9yZSBkZXRhaWwsIGluY2x1ZGluZyB0aGUgcXVhbnRpdGllcyBmb3IgZWFjaCBjbGFzcywgYnV0IHRoYXQgYXNzdW1lcyBsb29raW5nIGF0IHRoaXMgY2hhcnQgb24gYSBjb21wdXRlci4NCg0KIyMjIyBJbXByb3ZpbmcgdGhlIGNoYXJ0DQoNClRoZSBmaXJzdCBjaGFydCBjb3VsZCBiZSB2ZXJ5IGVmZmVjdGl2ZWx5IHByZXNlbnRlZCBpbiB0aGUgZm9ybSBvZiBhIHRhYmxlIGFuZCBwcm92aWRlIG5lYXJseSB0aGUgc2FtZSBsZXZlbCBvZiBpbmZvcm1hdGlvbi4gQnV0IHRvIGFuc3dlciBhbnkgZGVlcGVyIHF1ZXN0aW9ucyBsaWtlIGNoYW5nZSBvciBwcm9ncmVzcywgd2UgY2FuIG1ha2UgdGhlIHBpZSBjaGFydCBwcmVmZXJyZWQgb3ZlciBhIHRhYmxlIGJ5IHByb3ZpZGluZyBhIHNlcmllcyBvZiBwaWUgY2hhcnRzIHRvIHNob3cgcHJvZ3Jlc3Npb24gYW5kIGNoYW5nZSBvdmVyIHRpbWUuIFNlZWluZyB0aGUgbnVtYmVycyBjaGFuZ2UgaW4gdGFidWxhciBmb3JtYXQgd291bGQgbm90IGJlIGFzIGVhc3kgdG8gbm90aWNlLiBUaGUgZmlyc3QgcGllIGNoYXJ0IGlzIGp1c3QgYSBzbmFwc2hvdCBpbiB0aW1lLiBXZSBjYW4gaGVscCBhZGQgaW5mb3JtYXRpdmUgdmFsdWUgYnkgY3JlYXRpbmcgdGhlIHNhbWUgYmFzaWMgY2hhcnQsIGp1c3QgdXNpbmcgZGlmZmVyZW50IHNuYXBzaG90cyBpbiB0aW1lLiBIZXJlLCB3ZSB3aWxsIGFkZCB0d28gcGllIGNoYXJ0cywgb25lIGZyb20gdGhlIHllYXIgMjAwMCwgYW5kIGFub3RoZXIgZnJvbSB0aGUgeWVhciAyMDEwLg0KDQpgYGB7cn0NCiNNYWtlIHRoZSBvdGhlciAyIGRhdGEgdGFibGVzIGZvciAyMDAwIGFuZCAyMDEwDQp5MjAwMF92ZWhpY2xlcyA8LSBzdWJzZXQodmVoaWNsZXMsIHllYXIgPT0gMjAwMCkNCmNhcnMyMDAwIDwtIHNlbGVjdCh5MjAwMF92ZWhpY2xlcywgImRyaXZlIiwgImZ1ZWxUeXBlMSIsICJtYWtlIiwgIm1vZGVsIikNCnkyMDEwX3ZlaGljbGVzIDwtIHN1YnNldCh2ZWhpY2xlcywgeWVhciA9PSAyMDEwKQ0KY2FyczIwMTAgPC0gc2VsZWN0KHkyMDEwX3ZlaGljbGVzLCAiZHJpdmUiLCAiZnVlbFR5cGUxIiwgIm1ha2UiLCAibW9kZWwiKQ0KI0dldCB0aGUgcXVhbnRpdGllcyBieSBGdWVsIFR5cGUNCmNhcnMyMDAwdCA8LSBjYXJzMjAwMCAlPiUNCmdyb3VwX2J5KGZ1ZWxUeXBlMSkgJT4lDQpzdW1tYXJpc2UocXR5ID0gbigpKQ0KY2FyczIwMDB0DQpgYGANCmBgYHtyfQ0KY2FyczIwMTB0IDwtIGNhcnMyMDEwICU+JQ0KZ3JvdXBfYnkoZnVlbFR5cGUxKSAlPiUNCnN1bW1hcmlzZShxdHkgPSBuKCkpDQpjYXJzMjAxMHQNCmBgYA0KYGBge3J9DQpjb21ib19waWUgPC0gcGxvdF9seSgpDQpjb21ib19waWUgPC0gY29tYm9fcGllICU+JSBhZGRfcGllKGRhdGEgPSBjYXJzMjAwMHQsIGxhYmVscyA9IH5mdWVsVHlwZTEsIHZhbHVlcyA9IH5xdHksDQogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIyMDAwIiwgdGl0bGUgPSAiMjAwMCIsIGRvbWFpbiA9IGxpc3Qocm93ID0gMCwgY29sdW1uID0gMCkpDQpjb21ib19waWUgPC0gY29tYm9fcGllICU+JSBhZGRfcGllKGRhdGEgPSBjYXJzMjAxMHQsIGxhYmVscyA9IH5mdWVsVHlwZTEsIHZhbHVlcyA9IH5xdHksDQogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIyMDEwIiwgdGl0bGUgPSAiMjAxMCIsIGRvbWFpbiA9IGxpc3Qocm93ID0gMCwgY29sdW1uID0gMSkpDQpjb21ib19waWUgPC0gY29tYm9fcGllICU+JSBhZGRfcGllKGRhdGEgPSBjYXJzNSwgbGFiZWxzID0gfmZ1ZWxUeXBlMSwgdmFsdWVzID0gfnF0eSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIjIwMjAiLCB0aXRsZSA9ICIyMDIwIiwgZG9tYWluID0gbGlzdChyb3cgPSAwLCBjb2x1bW4gPSAyKSkNCmNvbWJvX3BpZSA8LSBjb21ib19waWUgJT4lIGxheW91dCh0aXRsZSA9ICJPZmZlcmluZ3MgYnkgRnVlbCBUeXBlLCAyMDAwLTIwMjAiLA0KICAgICAgICAgICAgICAgICAgICAgIGdyaWQ9bGlzdChyb3dzPTEsIGNvbHVtbnM9MyksIGxlZ2VuZCA9IGxpc3Qob3JpZW50YXRpb24gPSAnaCcpLA0KICAgICAgICAgICAgICAgICAgICAgIHhheGlzID0gbGlzdChzaG93Z3JpZCA9IEZBTFNFLCB6ZXJvbGluZSA9IEZBTFNFLCBzaG93dGlja2xhYmVscyA9IEZBTFNFKSwNCiAgICAgICAgICAgICAgICAgICAgICB5YXhpcyA9IGxpc3Qoc2hvd2dyaWQgPSBGQUxTRSwgemVyb2xpbmUgPSBGQUxTRSwgc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSkpDQpjb21ib19waWUNCmBgYA0KQnkgY29tYmluaW5nIGFsbCB0aHJlZSBpbiBvcmRlciBpbiBhIHNlcmllcyBvZiBwaWUgY2hhcnRzLCB3ZSBjYW4gbm93IHNlZSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBkbyBtb3JlIGludGVyZXN0aW5nIHRoaW5ncyB2aXN1YWxseSBsaWtlIHBlcmNlaXZlIHBhdHRlcm5zIGFuZCB0cmVuZHMuIENvbXBhcmVkIHdpdGggYSBzaW1wbGUgc25hcHNob3QgaW4gdGltZSwgd2UgY2FuIG5vdyBzZWUgdGhlIHByb2dyZXNzaW9uIG92ZXIgdGltZSBvZiBpbmNyZWFzZWQgb2ZmZXJpbmdzIGNhbGxpbmcgZm9yIHByZW1pdW0gZ2Fzb2xpbmUgaW5zdGVhZCBvZiByZWd1bGFyLWdyYWRlLiBXZSBjYW4gYWxzbyBzZWUgdGhhdCB3aGlsZSBuYXR1cmFsIGdhcyBwb3dlcmVkIG5ldmVyIGhhZCBtYW55IG9mZmVyaW5ncywgYW5kIGFjdHVhbGx5IGRlY2xpbmVkIGR1cmluZyB0aGUgcmV2aWV3IHBlcmlvZC4gV2UgYWxzbyBzZWUgZWxlY3RyaWMgdmVoaWNsZXMgZ29pbmcgZnJvbSBqdXN0IHVuZGVyIDAuNSUgdG8gb3ZlciAzJS4gQSBzaXgtZm9sZCBpbmNyZWFzZSBpcyBxdWl0ZSBhIGxvdCBmb3Igc3VjaCBhIHNtYWxsIHBvcnRpb24gb2YgdGhlIG92ZXJhbGwgbWFya2V0IG9mZmVyaW5ncy4NCg0KIyMjIFN1aXRhYmlsaXR5IG9mIFBpZSBDaGFydHMNCg0KQXMgd2l0aCB0aGUgIk5vIEZyZWUgTHVuY2giIHRoZW9yZW0sIHRoZXJlIGFyZSBubyBnb29kIGJsYW5rZXQgcnVsZXMgYWJvdXQgdGhlIHVzYWdlIG9mIHBpZSBjaGFydHMuIEFzIHNob3duLCBhIHBpZSBjaGFydCByZXByZXNlbnRpbmcgYSBzaW5ndWxhciBwb2ludCBpbiB0aW1lLCBvZmZlcmVkIHdpdGhvdXQgY29udGV4dCwgY2FuIGVhc2lseSBiZSBtaXNsZWFkaW5nLiBBcyB0aGUgbnVtYmVyIG9mIGNhdGVnb3JpZXMgdG8gcmVwcmVzZW50IGluIHRoZSBwaWUgY2hhcnQgZ2V0IGFkZGVkLCB0aGV5IGRvIGJlY29tZSBsZXNzIHVzZWZ1bCBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgNSBwZXJjZW50IHNsaWNlIG9mIHRoZSBwaWUgYW5kIGEgNyBwZXJjZW50IHNsaWNlIGlzIGhhcmQgdG8gdGVhc2Ugb3V0IHdoZW4gdGhlcmUgYXJlIDEwIG90aGVyIGNhdGVnb3JpZXMgYWxsIHdpdGggc2luZ2xlIGRpZ2l0IHBlcmNlbnRhZ2Ugc2xpY2VzLg0KDQpIb3dldmVyLCBmb3IgYSBsaW1pdGVkIG51bWJlciBvZiBjYXRlZ29yaWVzICh1c3VhbGx5IDUgb3IgbGVzcyksIGFuZCBsYXJnZSBkaXNwYXJpdGllcyBpbiB0aGUgcHJvcG9ydGlvbnMgb2YgdGhlIGNhdGVnb3JpZXMsIGEgcGllIGNoYXJ0IGNhbiBoaWdobGlnaHQgdGhlIGxhcmdlIGRpZmZlcmVuY2VzIHF1aWNrbHkgYW5kIGVhc2lseS4gVXN1YWxseSwgdGhvdWdoLCBhIHBpZSBjaGFydCBuZWVkcyBjb250ZXh0IHRvIGhlbHAgY29udmV5IGEgbWVzc2FnZS4gVGhpbmtpbmcgYWJvdXQgaG93IGEgcGllIGNoYXJ0IGlzIG1hZGUgaW4gKmdncGxvdDIqIGFzIHJlYWxseSBqdXN0IGEgc2luZ2xlLXdpZHRoIHN0YWNrZWQgYmFyIGdyYXBoLCBwcmVzZW50ZWQgaW4gcG9sYXIgY29vcmRpbmF0ZXMgb2ZmZXJzIHNvbWUgb2YgdGhlIHJlYWwgd2Vha25lc3NlcyBvZiBwaWUgY2hhcnRzLiBTcGVjaWZpY2FsbHksIGEgcGllIGNoYXJ0IGNhbiB1c3VhbGx5IGJlIGV4cHJlc3NlZCBpbiBtdWx0aXBsZSBvdGhlciBmb3JtcyBhbmQgYmUganVzdCBhcyBlYXN5IHRvIHVzZSBhbmQgdW5kZXJzdGFuZC4gQ291cGxpbmcgdGhlIHJlbGF0aXZlIHJlZHVuZGFuY3kgb2YgcGllIGNoYXJ0cyB3aXRoIHRoZSBjaGFsbGVuZ2VzIGluIHNob3dpbmcgYSBsb3Qgb2YgY2F0ZWdvcmllcyBpbiBhIGNsZWFyIHdheSBkb2Vzbid0IGRlbWFuZCB0aGF0IHRoZXkgYmUgYXZvaWRlZCwgYnV0IHJhdGhlciBvbmUgc2hvdWxkIHBvdGVudGlhbGx5IGxvb2sgZm9yIGFub3RoZXIgcmVwcmVzZW50YXRpb24gdGhhdCB3b3JrcyBhcyB3ZWxsIG9yIGJldHRlci4gUGllIGNoYXJ0cyBtaWdodCBiZSBhIHR5cGUgb2YgdmlzdWFsaXphdGlvbiB0byBhdm9pZCBmb3IgYSBsb3Qgb2Ygc2l0dWF0aW9ucywgYnV0IHRoZXJlIHdvdWxkIHN0aWxsIHJlbWFpbiB0aGUgc2l0dWF0aW9ucyAtIGluZnJlcXVlbnQgYXMgdGhleSBtYXkgYmUgLSB3aGVyZSBhIHBpZSBjaGFydCBpcyBoaWdobHkgZWZmZWN0aXZlIGFuZCBhcHByb3ByaWF0ZS4NCg0KIyMjIFJlZmVyZW5jZXM6DQoNClVuaXRlZCBTdGF0ZXMgRW52aXJvbm1lbnRhbCBQcm90ZWN0aW9uIEFnZW5jeS4gKDIwMjEpLiBWZWhpY2xlcy5jc3YgW0RhdGEgc2V0XSBSZXRyaWV2ZWQgZnJvbTogPGh0dHBzOi8vd3d3LmZ1ZWxlY29ub215Lmdvdi9mZWcvZXBhZGF0YS92ZWhpY2xlcy5jc3Y+IChBY2Nlc3NlZCA4IFNlcCAyMDIyKS4NCg==